package com.qtrue.exer;

/**
 * @Package: com.qtrue.exer
 * @ClassName: ArrayDemo07
 * @Author: xiaoBao
 * @CreateTime: 2022-03-06 15:10
 * @Description:算法（数组练习）：数组的复制、反转、查找（线性查找、二分法查找）
 */
public class ArrayDemo07 {
    public static void main(String[] args) {
        // 声明一个数组
        String[] arr1 = new String[]{"JJ","DD","GG","MM","BB","AA"};

        // 数组的[复制]（区别于数组变量的赋值）
        String[] arr2 = new String[arr1.length];
        for(int i=0;i<arr2.length;i++){
            arr2[i] = arr1[i];
        }


        // 数组的[反转]
        // 方法一：
//        for(int i=0;i<arr1.length / 2;i++){ // 除以2是为了控制循环次数，如果全部循环不控制则数组和原来一模一样（不用担心除不尽）
//            String temp = arr1[i];  // 保存前面元素
//            arr1[i] = arr1[arr1.length -i -1]; // 前面替换后面对应的元素
//            arr1[arr1.length -i -1] = temp; // 将后面元素替换为前面元素
//        }
//        // 方法二：
//        for(int i=0,j=arr1.length-1;i < j;i++,j--){
//            String temp = arr1[i];
//            arr1[i] = arr1[j];
//            arr1[j] = temp;
//        }
        for(int i=0;i<arr1.length;i++){ // 输出数组中所有元素
            System.out.print(arr1[i] + "\t");
        }


        // 数组的[查找]（或搜索）
        // 线性查找：
        String dest = "BB"; // 要查找的目标
        boolean isFlag = true; // 定义一个标识来控制流程

        for(int i=0;i<arr1.length;i++){
            if(arr1[i].equals(dest)){
                isFlag = false;
                System.out.println("找到了指定的元素，位置为：" + i);
                break; // 打断循环
            }
        }
        if(isFlag){
            System.out.println("很遗憾，没有找到哦！");
        }

        // 二分法查找：
        // 前提：要查找的数组必须有序（无论降序升序都可以）。
        int[] arr3 = new int[]{-12,-18,-23,12,44,46,52,56,62,124,214};

        int dest1 = 62; // 需要查找的目标值
        int head = 0; // 初始的首索引
        int end = arr3.length - 1; // 初始的末索引
        boolean isDest = true;  // 用于标识需要找的值是否被找到

        // 使用while循环来进行二分法查找，可以更有效地找到目标值
        while(head <= end){
            // 首尾索引相加得到中间下标
            int middle = (head + end) / 2;

            if(dest1 == arr3[middle]){  // 判断如果需要找的元素刚好是中间下标的值
                System.out.println("找到了指定的元素，位置为：" + middle);
                isDest = false;
                break;  // 如果没有执行到这一步，就不会break，则继续判断继续循环，直到满足当前条件分支为止。
            }else if(arr3[middle] > dest1){ // 如果中间值大于需要找的元素，那么将尾部索引改成中间索引，往左边找，反之往右。
                end = middle - 1;   // 将尾部索引定义为middle当前的索引，然后循环重新执行
            }else { // arr2[middle] < dest1 以上条件都不满足，那就是中间索引的值小于需要找的值，则需将首部索引改成中间索引。
                head = middle + 1;
            }

        }
        if(isDest){
            System.out.println("很遗憾，没有找到哦！");
        }

    }
}
